#include "loginbar.h"
#include "ui_loginbar.h"
#include <QPixmap>
#include <QIcon>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QCryptographicHash>
#include <QMessageBox>
#include <QSqlError>

loginBar::loginBar(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::loginBar),
    timer(new QTimer(this))
{
    ui->setupUi(this);

    // 记录系统启动日志
    LogManager::logSystem("登录模块", "登录模块初始化开始");

    // 设置密码输入框为密码模式（显示为圆点或星号）
    ui->lineEdit_password->setEchoMode(QLineEdit::Password);

    // 连接登录按钮的点击事件
    connect(ui->pushButton, &QPushButton::clicked, this, &loginBar::on_pushButton_clicked);
    // 连接注册按钮的点击事件
    connect(ui->pushButton_register, &QPushButton::clicked, this, &loginBar::on_pushButton_register_clicked);

    // 放头像
    ui->label->setPixmap(QPixmap(":/image/OIP-C.png"));
    // 图片自适应容器大小
    ui->label->setScaledContents(true);

    ui->lineEdit_admin->addAction(QIcon(":/image/admin.png"), QLineEdit::LeadingPosition);
    ui->lineEdit_password->addAction(QIcon(":/image/password.png"), QLineEdit::LeadingPosition);

    connect(timer, &QTimer::timeout, this, [=](){
        emit clearMsg();//给主窗口发送一个清除的信号
    });

    // 数据库链接
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
    database.setDatabaseName("D:/sqlite/system.db");  // 修改为您的数据库路径
    if(database.open()){
        qDebug() << "数据库链接成功！";
        LogManager::logSystem("登录模块", "数据库连接成功");

    }else{
        qDebug() << "数据库链接失败！";
        QString error = database.lastError().text();
        LogManager::logError("数据库连接失败: " + error);

        QMessageBox::critical(this, "错误", "数据库连接失败: " + error);
    }

    LogManager::logSystem("登录模块", "登录模块初始化完成");
}

loginBar::~loginBar()
{
    // 记录系统关闭日志
    LogManager::logSystem("登录模块", "登录模块销毁");

    if (timer->isActive()) {
        timer->stop();
    }

    delete ui;
}

// 使用SHA256加密密码
QString loginBar::hashPassword(const QString &password)
{
    QByteArray hash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha256);
    return QString(hash.toHex());
}

void loginBar::on_pushButton_clicked()
{
    QString username = ui->lineEdit_admin->text();
    QString password = ui->lineEdit_password->text();

    if (username.isEmpty() || password.isEmpty()) {
       // 记录详细错误
       LogManager::logError(QString("登录失败: 用户名或密码为空 | 尝试用户:%1").arg(username));
       emit loginFail("用户名和密码不能为空！");
       return;
    }

    // 对密码进行SHA256哈希
    QString hashedPassword = hashPassword(password);
    qDebug() << "加密后密码:" << hashedPassword;

    QSqlQuery query;
    query.prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    query.bindValue(0, username);
    query.bindValue(1, hashedPassword);

    if(!query.exec()){
        QString error = query.lastError().text();
        qDebug() << "登录查询失败:" << error;

        // 记录数据库查询错误
        LogManager::logError(QString("登录查询失败 | 用户名:%1 | 数据库错误:%2")
                            .arg(username).arg(error));

        emit loginFail("登录查询失败！");
        return;
    }

    if(query.next()){
        QString db_username = query.value("username").toString();
        QString db_role = query.value("role").toString();
        int userId = query.value("user_id").toInt();

        qDebug() << "登录成功！用户：" << db_username << "，角色：" << db_role;

        // 记录成功登录 - 包含用户ID、角色、IP
        LogManager::logOperation(userId, "用户登录",
                               QString("用户名:%1 | 角色:%2 | 登录结果:成功")
                               .arg(db_username).arg(db_role));

        emit loginSuccess(userId, db_role);
    } else {
        qDebug() << "查询结果为空，用户名或密码错误";

        // 检查用户是否存在
        QSqlQuery checkUser;
        checkUser.prepare("SELECT * FROM users WHERE username = ?");
        checkUser.bindValue(0, username);

        if(checkUser.exec() && checkUser.next()){
            qDebug() << "用户存在，但密码不匹配";

        } else {
            qDebug() << "用户不存在";


        }

        timer->setSingleShot(true);
        timer->start(3000);
        emit loginFail("账号或密码错误！");
    }
}

void loginBar::on_pushButton_register_clicked()
{
    // 记录操作日志
    LogManager::logSystem("登录模块", "用户点击注册按钮");

    emit registerRequested();  // 发射注册请求信号
}

void loginBar::clearLoginInfo()
{
    ui->lineEdit_admin->clear();
    ui->lineEdit_password->clear();

    // 记录系统日志
    LogManager::logSystem("登录模块", "清空登录信息");
}
